package org.dllwh.alibaba.nacos.plugin.datasource.dialect;

/**
 * 把今天最好的表现当作明天最新的起点．．～
 * <p>
 * Today the best performance as tomorrow the newest starter!
 *
 * @ClassName DatabaseDialect
 * @Description 数据库方言
 * @Date 2024-11-23 10:58
 * @版本 V 1.0.1
 * @since JDK 17
 */
public interface DatabaseDialect {
    /**
     * 获取数据库类型
     */
    String getType();

    /**
     * 获取第一个索引页参数。
     *
     * @param page     当前页面码
     * @param pageSize 当前页面大小
     * @return 偏移值或最大范围
     */
    int getPagePrevNum(int page, int pageSize);

    /**
     * 获取第二个索引页参数。
     *
     * @param page     当前页面码
     * @param pageSize 当前页面大小
     * @return 极限值或最小值范围
     */
    int getPageLastNum(int page, int pageSize);

    /**
     * 获取页面限制顶部数据sql，包含占位符。
     *
     * @param sql 原始sql
     * @return 附加限制sql
     */
    String getLimitTopSqlWithMark(String sql);

    /**
     * 获取页面限制页面数据sql，包含占位符。
     *
     * @param sql 原始sql
     * @return 附加限制sql
     */
    String getLimitPageSqlWithMark(String sql);

    /**
     * 使用number获取页面限制页面数据sql。
     *
     * @param sql      原始sql
     * @param pageNo   当前页面码
     * @param pageSize 当前页面大小
     * @return contain page number param sql
     */
    String getLimitPageSql(String sql, int pageNo, int pageSize);

    /**
     * 使用offset获取页面限制页面数据sql。
     *
     * @param sql         原始sql
     * @param startOffset 当前偏移行
     * @param pageSize    当前页面大小
     * @return 包含页码参数sql
     */
    String getLimitPageSqlWithOffset(String sql, int startOffset, int pageSize);

    /**
     * 获取数据库返回主键。
     */
    String[] getReturnPrimaryKeys();
}
